package com.learning.spring.optimize.property.editor;

import lombok.Getter;
import lombok.Setter;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditorSupport;
import java.beans.SimpleBeanInfo;

/**
 * ClassName: PropertyEditor
 * Description: 属性编辑器
 * Date: 2018/8/7 15:52 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class PropertyEditor {


    /**
     * JavaBean 编辑器
     * 1、java.beans.PropertyEditor 接口定义了设置 JavaBean 属性的方法
     * 2、java.beans.BeanInfo 接口描述了 JavaBean 哪些属性是可定制的，描述了可定制属性与PropertyEditor 接口的对应关系
     * 3、java.beans.PropertyEditorManager 负责管理默认属性编辑器。内部保存一些常见类型的属性编辑器
     * <p>
     * PropertyEditor 属性编辑器接口
     * 1、一些方法：void setValue(Object value);、 Object getValue();
     * 2、实现类 PropertyEditorSupport ，一般情况下用户自定义可以扩展这个类
     * <p>
     * BeanInfo 主要描述了 JavaBean 的哪些属性可以编辑以及对应的编辑器。
     * 每一个属性对应一个属性描述器 PropertyDescriptor
     */
    static void test() {

    }


    @Setter
    @Getter
    class Person {
        private String name;
        private String age;
        private String sex;
    }

    /**
     * 为 Person 的sex属性创建的属性编辑器
     */
    class PersonSexEditor extends PropertyEditorSupport {

        private String[] options = {"male", "female"};

        /**
         * 将内部的属性值转换为对应的字符串表示形式，供属性表机器显示用
         *
         * @return
         */
        @Override
        public String getAsText() {
            int value = (int) getValue();
            return options[value];
        }

        /**
         * 将外部设置的字符串转换为内部属性的值
         *
         * @param text
         * @throws IllegalArgumentException
         */
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            for (int i = 0; i < options.length; i++) {
                if (options[i].equals(text)) {
                    setValue(text);
                    return;
                }
            }
        }

        /**
         * 可选属性值得的字符串标识数组
         *
         * @return
         */
        @Override
        public String[] getTags() {
            return options;
        }
    }

    /**
     * Person 对应的 BeanInfo 类，将属性编辑器和Person的属性关联起来
     */
    class PersonBeanInfo extends SimpleBeanInfo {
        @Override
        public PropertyDescriptor[] getPropertyDescriptors() {
            PropertyDescriptor propertyDescriptor = null;
            try {
                propertyDescriptor = new PropertyDescriptor("sex", Person.class);
                // 设置属性编辑器
                propertyDescriptor.setPropertyEditorClass(PersonSexEditor.class);
            } catch (IntrospectionException e) {
                e.printStackTrace();
            }

            return new PropertyDescriptor[]{propertyDescriptor};
        }
    }


}
